<!-- 
  学前端，到码路，
  线下9888，五个多月
  免费试听一个月，就业率在主页公布
 -->

<!-- 
   面试题：说一下HTTP缓存机制？

    为什么需要缓存？
      1）让网页更快显示出来，就是提高性能
      2）计算机执行JS代码非常快
      3）通过网络加载资源，受到网络的影响。使用缓存，是用于缓存网络资源

    什么是缓存？
      在某些情况下，资源不是每次都需要从服务器获取的。而是第一次获取之后缓存起来，后面再去请求同样的资源直接走缓存了，而不是去请求服务器。

    哪些资源需要缓存？
      1）html页面不需要缓存
      2）业务数据也是不能缓存的
      3）静态资源可以缓存，css，js，图片等静态资源可以缓存。

    缓存策略：
      1）强制缓存（客户端缓存）
      2）协商缓存（对比缓存）

    强制缓存：
      是通过一个响应头来控制的，这个头叫Cache-Control。取值如下：
        max-age:31536000 单位是 s ，该资源被强制缓存 1 年
        no-cache  不使用强制缓存，但是不妨碍使用协商缓存 
        no-store  禁用缓存，每次都从服务器获取最新的资源
      还有一个头，叫Expires，也是用于强制缓存 
        http1.0中的头，设置缓存过期时间，由于本地时间和服务器时间可能不一致，会导致其它问题。
        已经被Cache-Control代替了。
  -->

<!-- 
  协商缓存：
    当强制缓存失效了，请求会被发送到服务器，此时，服务器也不一定每次都要返回资源，如果客户端资源还有效的话，就会走协商缓存。有两对头。
    1）Last-Modified(Response Headers)  和  If-Modified-Since（Resqeust Headers）
      1.txt  2023 05 24 8:00:00              2023 05 24 8:00:00
      1.txt  2023 05 25 8:00:00 
      Last-Modified 服务端返回资源的最后修改时间  a.txt 20230327 10:00:00
      If-Modified-Since 再次请求时带着最后修改时间  a.txt 20230327 10:00:00
      服务器根据时间判断资源是否被修改（如未被修改则返回 304，失败则返回新资源和新的缓存规则）
    2）Etag(Response Headers) 和 If-None-Match（Resqeust Headers）
       Etag 服务端返回的资源唯一标识（类似人的指纹，唯一，生成规则由服务器端决定，结果就是一个字符串）
       If-None-Match 再次请求时带着这个标识
        服务端根据资源和这个标识是否 match （成功则返回 304，失败则返回新资源和新的缓存规则）

    如果两者一起使用，则优先使用 Etag 规则。因为 Last-Modified 只能精确到秒级别。

  在开发过程中，有不同的操作：
    1）正常操作：地址栏输入url，点击确定，前进后退。
    2）手动刷新：F5 或 点击了刷新按钮
    3）强制刷新：ctrl + F5

  上面的不同的操作缓存策略是不一样的：
    1）正常操作：强制缓存是有效的，协商缓存也有效
    2）手动刷新：强制缓存失效，协商缓存有效
    3）强制刷新：强制缓存失效，协商缓存失效

  虽然缓存比较好，在开发过程中，缓存有时候也比较恶心，需要强制刷新
-->

<!-- 
  面试题：HTTPS为什么安全？

  HTTP是明文传输，传输的所有内容（登录的用户名和密码），都会被中间代理获取到。

  HTTPS = HTTP + tls/ssl，传输的内容是加密传输的。只有客户端和服务器才能解密成明文，中间代理是无法解密。

  对称加密：
    一个密钥，即负责加密，也负责解密。
    浏览器访问服务器，服务器端生成密钥，并传递给浏览器。
    浏览器和服务器，通过个密钥来加密和解密信息。
    复用对称加密，传输数据效率是比较高的。

  非对称加密：
    有两个密钥，一个公钥，一个是私钥。
    公钥加密的信息，只有私钥能解密
    私钥加密的信息，只有公钥能解密

    浏览器访问服务端，服务端生成公钥、私钥，并把公钥传递给浏览器，私钥是服务器保存好的。
    浏览器生成一个key（是后期对称加密密钥），并使用公钥进行加密，传递给服务器。
    服务器只能使用私钥进行解密。解密完后，服务器就有key。
    后面，进行数据通信，使用key对数据进行加密，这个Key，在浏览器端和服务器端都，两者都可以进行加密和解密了。

  如果公钥和加密后的key，被劫持了，中间人能不能解密？
  答：不能，因为要解密key，需要使用私钥，私钥只在服务端有，没有传输。
 -->

 <!-- 
  证书：
    公钥劫持了，没什么用。如果中间人把公钥替换了，替换成中间人这个公钥（当然中间人有自己的私钥），你的所有请求都可以被他劫持到，就都可以解密了。这叫“中间人攻击”。

  这个问题，不好不从技术解决，那就从标准规范上解决=>CA证书
    - 这个证书由第三方正规机构颁发（可以去阿里云申请，但是花钱）
    - 证书：公钥，域名，申请人的信息，过期时间等
    - 浏览器识别到正规的证书，才使用。否则会交给用户选择。
  -->

